#pragma once

class cgzCireBuffer
{
public:
    cgzCireBuffer(int size);
    ~cgzCireBuffer();

    char *head();     // 获取当前可写入位置的指针
    char *tail();     // 获取当前可读取位置的指针
    int size() const; // 返回缓冲区总大小
    int left() const; // 返回剩余可写入空间
    int dire() const; // 返回剩余可写入空间
    int read() const; // 返回剩余可读取空间
    int used() const; // 返回已用空间

    void push(int len); // 移动写指针（写入数据后调用）
    void pop(int len);  // 移动读指针（读取数据后调用）
    void clear();       // 清空缓冲区

    bool empty() const;                                          // 判断是否为空
    bool full() const;                                           // 判断是否为满
    bool read(std::string &str) const;                           // 读取缓冲区数据
    bool read(void *dst, int len) const;                         // 读取缓冲区数据
    bool read(void *dst, int len, uint8_t masking_key[4]) const; // 读取缓冲区数据
    bool last(void *dst, int len) const;                         // 读取缓冲区数据
    bool push(void *dst, int len);                               // 写入缓冲区数据

private:
    int m_size;     // 缓冲区总大小
    int m_head;     // 写指针（指向下一个可写入位置）
    int m_tail;     // 读指针（指向下一个可读取位置）
    int m_real;     // 实际写入数据大小
    char *m_buffer; // 缓冲区指针
};